package main

import (
	"fmt"
	"net/http"
	"strings"
	"log"
)

/* URL(Uniform Resource Locator)
scheme://host[:port#]/path/.../[?query-string][#anchor]
scheme         指定底层使用的协议(例如：http, https, ftp)
host           HTTP服务器的IP地址或者域名
port#          HTTP服务器的默认端口是80，这种情况下端口号可以省略。如果使用了别的端口，必须指明，例如 http://www.cnblogs.com:8080/
path           访问资源的路径
query-string   发送给http服务器的数据
anchor         锚
*/

/* DNS工作原理
1、检查自己本地的hosts文件是否有这个网址映射关系，如果有，完成域名解析。
2、找本地DNS解析器缓存，如果有，直接返回，完成域名解析。
3、找TCP/IP参数中设置的首选DNS服务器，返回解析结果给客户机，完成域名解析，此解析具有权威性。
4、如果要查询的域名，不由本地DNS服务器区域解析，但该服务器已缓存了此网址映射关系，则调用这个IP
地址映射，完成域名解析，此解析不具有权威性。
5、如果本地DNS服务器本地区域文件与缓存解析都失效，转发模式 or 根DNS服务器。
*/

/* HTTP/1.1协议中定义了5类状态码
1XX 提示信息 - 表示请求已被成功接收，继续处理
2XX 成功 - 表示请求已被成功接收，理解，接受
3XX 重定向 - 要完成请求必须进行更进一步的处理
4XX 客户端错误 - 请求有语法错误或请求无法实现
5XX 服务器端错误 - 服务器未能实现合法的请求
*/

func sayhello(w http.ResponseWriter, r *http.Request) {
	fmt.Println("----------------------------------------");

	r.ParseForm()  //解析参数，默认是不会解析的
	fmt.Println(r.Form)  //这些信息是输出到服务器端的打印信息
	fmt.Println("path =", r.URL.Path)
	fmt.Println("scheme =", r.URL.Scheme)
	fmt.Println(r.Form["url_long"])
	for k, v := range r.Form {
		fmt.Println("key:", k)
		fmt.Println("val:", strings.Join(v, ""))
	}

	fmt.Fprintf(w, "Hello, this is go response!") //这个写入到w的是输出到客户端的
}

func main() {
	http.HandleFunc("/", sayhello) //设置访问的路由
	err := http.ListenAndServe(":9090", nil) //设置监听的端口
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}
